在 Bean生命周期(一) 浅尝知味 中,我们介绍了Bean的生命周期,并通过实验对其进行了验证,这次我们将从源码角度对其做进一步说明。整个Bean的生命周期,主要的逻辑就是实例化、初始化、销毁,而这些逻辑都集中在两个类里面,一个是 AbstractAutowireCapableBeanFactory,负责Bean的实例化与初始化,另外一个是 DisposableBeanAdapter,负责Bean的整个销毁流程。
Bean的创建
Bean的创建主要包括实例化与初始化两个阶段,都包含在 AbstractAutowireCapableBeanFactory 的 createBean() 的方法中。
实例化
实例化指创建Bean实例的过程,这里泛指创建Bean及其前后 InstantiationAwareBeanPostProcessor 相关方法的调用,即 Bean生命周期(一) 浅尝知味 中的第一条支线。
首先,看下 createBean() 方法,由于篇幅的原因,只贴出部分核心的代码,其它部分都将使用省略号进行代替。
1 |
|
整个方法里面主要包含了两部分逻辑:
在创建Bean之前,通过
resolveBeforeInstantiation()方法对InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()方法进行了调用;调用
doCreateBean()方法,该方法包含了除第一部分以外所有创建Bean的逻辑。
1 | protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) |
在 doCreateBean() 方法里面,又分为两部分:
实例化Bean对象,通过反射调用Bean对象的构造方法,对其进行实例化,创建一个Bean实例。
初始化Bean实例
- 通过
populateBean()方法完成对InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()方法调用。 - 调用
initializeBean()完成剩余所有初始化动作。
- 通过
至此,创建Bean流程的第一条线已经完成,用一个简单的时序图做一个阶段性的小结。

初始化
初始化的流程指Bean创建完成后,Aware 及 BeanPostProcessor 相关钩子方法的调用,可以完成Bean对象基本的初始化动作。
1 | protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { |
initializeBean() 方法可以分解成四个部分:
- 通过
invokeAwareMethods()方法完成对BeanNameAware、BeanFactoryAware的调用。 - 通过
applyBeanPostProcessorsBeforeInitialization()方法完成对ApplicationContextAware、BeanPostProcessor.postProcessBeforeInitialization()、@PostConstruct的调用。 - 通过
invokeInitMethods()方法完成对InitializingBean、init-method关联方法的调用。 - 通过
applyBeanPostProcessorsAfterInitialization()完成对BeanPostProcessor.postProcessAfterInitialization()方法调用。
在 invokeAwareMethods() 方法里面,除了调用 BeanNameAware 、BeanFactoryAware 外,还调用了 BeanClassLoaderAware 的 setBeanClassLoader() 方法。
1 | private void invokeAwareMethods(final String beanName, final Object bean) { |
这里,有一点需要注意的是,ApplicationContextAware 并没有在 invokeAwareMethods() 里面调用。而是在 applyBeanPostProcessorsBeforeInitialization() 通过调用 ApplicationContextAwareProcessor 的 postProcessBeforeInitialization() 方法实现的。 ApplicationContextAwareProcessor 的实现逻辑如下:
1 | class ApplicationContextAwareProcessor implements BeanPostProcessor { |
在 ApplicationContextAwareProcessor 的实现里面,还调用了 EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware 等钩子接口。而在 postProcessAfterInitialization() 未做任何处理,这使得在后面触发该方法调用时不会产生任何影响。
还有另外一个值得注意的地方是 @PostConstruct 也并未在 invokeInitMethods() 方法中调用,而是与 ApplicationContextAware 一样,使用 BeanPostProcessor 的方式实现,它对应的实现类是 InitDestroyAnnotationBeanPostProcessor,此类除了 BeanPostProcessor 接口外,还实现了 DestructionAwareBeanPostProcessor 接口,并在此接口定义的方法中完成了对 @PreDestroy 的处理。具体的实现如下:
1 | public class InitDestroyAnnotationBeanPostProcessor |
在 applyBeanPostProcessorsBeforeInitialization() 方法里,除了ApplicationContextAware,@PostConstruct 以外,主要是调用了 BeanPostProcessor 的 postProcessBeforeInitialization() 方法。
1 | protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd) |
在 invokeInitMethods() 方法中,完成了如下两件事情:
- 调用
InitializingBean的afterPropertiesSet()方法 - 调用
<bean>的init-method或@Bean的initMethod指定的方法
最后的 applyBeanPostProcessorsAfterInitialization() 方法,不再多做介绍,与 applyBeanPostProcessorsBeforeInitialization() 类似,完成对 BeanPostProcessor.postProcessAfterInitialization() 方法的调用。
同样,在最后,我们使用时序图对初始化流程做下小结
2019-10-02_17-11-47.png)
Bean 销毁
Bean 销毁的流程全部在 DisposableBeanAdapter 的 destroy() 方法里面,流程比较简单,直接上代码
1 | public void destroy() { |
destroy() 方法的主要逻辑如下:
- 通过
InitDestroyAnnotationBeanPostProcessor实现DestructionAwareBeanPostProcessor接口,完成对@PreDestroy标注方法的调用 - 调用
DisposableBean的destroy()方法 - 调用
<bean>的destroy-method或@Bean的destroyMethod指定的方法
Bean销毁流程的时序图整理如下: